﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CBE.Model;
using Common.ServiceLogic;
using CBE.DataAccess;

namespace CBE.Services
{
    public class AdministrarTurnosServiceLogic : GenericEntityManagerServiceLogic<Turnos, AdministrarTurnosCriteria, AdministrarTurnosView, AdministrarTurnosDataAccess>
    {
        public List<Turnos> ReadEntitiesByCritera(AdministrarTurnosCriteria criteria)
        {
            return DataAccess.ReadEntitiesByCritera(criteria);
        }

        public DisponibilidadTurnoData ValidateDisponibilidad(Turnos turno)
        {
            var rta = new DisponibilidadTurnoData();
            
            var queryPorEmpleado = DataAccess.ReadByEmpleado(turno);

            rta.IsValid = true;

            var horariosnodisponibles = new List<Turnos>();

            foreach (var item in queryPorEmpleado)
            {
                if (
                    (turno.Hora >= item.Hora &&
                     turno.Hora < item.Hora.Add(item.Servicios.DuracionAproximada)) ||
                    (turno.Hora.Add(turno.Servicios.DuracionAproximada) >= item.Hora &&
                     turno.Hora.Add(turno.Servicios.DuracionAproximada) < item.Hora.Add(item.Servicios.DuracionAproximada))
                )
                {
                    rta.IsValid = false;
                    horariosnodisponibles.Add(item);
                }
            }
            if (horariosnodisponibles.Count != 0)
            {
                var horariosOrdenados = horariosnodisponibles.OrderBy(t => t.Hora).Select(
                    t => new { HoraDesde = t.Hora, HoraHasta = t.Hora.Add(t.Servicios.DuracionAproximada) });

                rta.HorarioPosteriorDisponible = horariosOrdenados.FirstOrDefault().HoraHasta.ToString();
            }
            return rta;
        }

        public void Cancelar(Common.Model.ViewEntity viewEntity)
        {
            DataAccess.Cancelar(viewEntity);
        }

        public void CancelarTurnosAnteriores()
        {
            DataAccess.CancelarTurnosAnteriores();
        }
    }
}
